package com.faceAI.demo.UVCCamera.manger;

import static android.content.Context.CAMERA_SERVICE;
import static androidx.core.content.ContextCompat.getSystemService;

import android.content.Context;
import android.graphics.Bitmap;
import android.hardware.camera2.CameraManager;
import android.hardware.usb.UsbDevice;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.ai.face.base.utils.DataConvertUtils;


import java.nio.ByteBuffer;
import java.util.List;

/**
 * USB摄像头（UVC协议）管理
 * 根据关键字keyword 是RGB/IR（不同厂商命名方式不一样）来区分双面摄像头哪个是RGB 摄像头哪个是红外
 * 默认的分辨率设置 写在{@link com.faceAI.demo.FaceAIConfig},可以根据下面的方法来获取后修改合适的值
 * <p>
 * 如果本SDK Demo不能管理你的定制摄像头，请参考https://github.com/shiyinghan/UVCAndroid
 * 熟悉后可以自己实现一个 UsbCameraManager来管理你的摄像头各种适配
 */
public class UVCCameraManager {
    // 配置UVC 协议摄像头默认的分辨率，请参考你的摄像头能支持的分辨率，分辨率不用那么高关键在成像能力
    // 分辨率太高需要高性能的硬件配置。强烈建议摄像头的宽动态值 > 105DB
    public static final int UVC_CAMERA_WIDTH = 640;
    public static final int UVC_CAMERA_HEIGHT = 480;

    //默认匹配的摄像头关键字，但并不是所有的摄像头命名都规范会带有这种关键字样
    public static final String RGB_KEY_DEFAULT ="RGB";
    public static final String IR_KEY_DEFAULT="IR";

    private boolean autoAspectRatio = true;   //摄像头画面自行管理，源码完全开放
    private int previewHeight = UVC_CAMERA_HEIGHT;
    private OnFaceAIAnalysisCallBack faceAIAnalysisCallBack;
    private OnCameraStatusCallBack onCameraStatuesCallBack;

    private CameraBuilder cameraBuilder;
    private Context context;

    private int width=UVC_CAMERA_WIDTH,height=UVC_CAMERA_HEIGHT;
    private Bitmap reuseBitmap=null;

    public interface OnCameraStatusCallBack {
        void onAttach(UsbDevice device);
        void onDeviceOpen(UsbDevice device, boolean isFirstOpen);
    }

    /**
     * 对每帧bitmap 进行分析，如果SDK上一帧还在处理就可以丢弃掉
     */
    public interface OnFaceAIAnalysisCallBack {
        void onBitmapFrame(Bitmap bitmap);
    }


    /**
     * 构造方法
     *
     * @param cameraBuilder
     */
    public UVCCameraManager(CameraBuilder cameraBuilder) {
        this.cameraBuilder = cameraBuilder;
        this.context=cameraBuilder.getContext().getApplicationContext();
        initCameraHelper();
        initUVCCamera();
    }


    private void initCameraHelper() {

    }

    public void setOnCameraStatuesCallBack(OnCameraStatusCallBack callBack) {
        onCameraStatuesCallBack = callBack;
    }

    /**
     * 使用结束后, 释放 camera
     *
     */
    public void releaseCameraHelper() {


        faceAIAnalysisCallBack =null;
        onCameraStatuesCallBack = null; // 添加这行
        cameraBuilder=null;
    }


    /**
     * 根据摄像头的名字来选择使用哪个摄像头
     */
    private void initUVCCamera() {
//        String tag = "UVCCameraManager";
//        //不同厂家生产的摄像头有点差异，请开发者自己实现匹配逻辑
//        final List<UsbDevice> list = mCameraHelper.getDeviceList();
//        CameraManager mCameraManager = getSystemService(context, CameraManager.class) ;
//        Log.d(tag, "---------摄像头：" + list.size());
//        boolean isMatched = false;
//        for (UsbDevice device : list) {
//            String name = device.getProductName();
//
//            Log.d(tag, "---------摄像头名字：" + name);
//            if (TextUtils.isEmpty(name)) {
//                Toast.makeText(context, "摄像头ProductName为空", Toast.LENGTH_LONG).show();
//            } else if (name.toLowerCase().contains(cameraBuilder.getCameraKey().toLowerCase())) { //忽略大小写
//                isMatched = true; //匹配成功了
//                mCameraHelper.selectDevice(device);
//                //角度旋转，范围为 0 90 180 270
//                mCameraHelper.setPreviewConfig(mCameraHelper.getPreviewConfig().setRotation(cameraBuilder.getDegree()));
//                //是否水平左右翻转
//                if (cameraBuilder.isHorizontalMirror()) {
//                    mCameraHelper.setPreviewConfig(mCameraHelper.getPreviewConfig().setMirror(MirrorMode.MIRROR_HORIZONTAL));
//                }
//                break;
//            }
//        }
//        if (!isMatched) {
//            //Demo 需要允许用户手动去选择设置，傻瓜式操作
//            Toast.makeText(context, cameraBuilder.getCameraName() + "匹配失败,请手动匹配", Toast.LENGTH_LONG).show();
//        }
    }

    /**
     * 设置回调,给人脸识别SDK分析每帧数据，帧率15～30
     */
    public void setFaceAIAnalysis(OnFaceAIAnalysisCallBack callBack) {
        faceAIAnalysisCallBack = callBack;
    }

}
